#ifndef AUTHCHANNEL_H
#define AUTHCHANNEL_H
#include <string>
#include <map>
#include <memory>
#include <QDebug>

enum E_CHANNEL{
    CHANNEL_INVALID,
    CHANNEL_AUTH,
    CHANNEL_TRADE,
    CHANNEL_RISK
};

struct PACKET_INFO
{
    int nEncr;  //是否加密，明文0，密文1
    E_CHANNEL nChannel; // 通信通道 1（认证） 2（交易） 3（查询） 4（风控）
    int nTimeOut;
    std::map<std::string,std::string> mapPara; // 装载请求信息

    std::string GetParaValue( const std::string& sKey ) const
    {
        std::map<std::string,std::string>::const_iterator cit = mapPara.find(sKey);
        if( cit != mapPara.end() )
        {
            return cit->second;
        }

        return "";
    }
    void AddPara( const std::string& sKey, const std::string& sValue )
    {
        mapPara[sKey] = sValue;
    }

    PACKET_INFO() : nTimeOut(30)
    {

    }
    PACKET_INFO(E_CHANNEL chl) : nChannel(chl),nEncr(1)
    {

    }
//    PACKET_INFO( const std::string& sExchCodeT ) : sExchCode(sExchCodeT) {}
};

static std::string Get8BitLength(int nOutLen)
{
    char szLenFmt[64] = {0};
    sprintf(szLenFmt,"%c0%dd",'%',8);
    char szLen[128] = {0};
    sprintf(szLen,szLenFmt,nOutLen);
    std::string str = szLen;
    return str;
}

class AuthChannel
{
public:
    AuthChannel();

    //接收数据特别的处理 SufRecvHandle具体处理可能是解密,解压缩, 若无需任何处理则返回0,若出错返回-1,否则返回1
    int SufRecvHandle(const char* pRecvBuf, unsigned int ulLen, std::string& sRsp);
    int PreSendHandle(std::shared_ptr<char> &sendEnBuf, const std::string sSend);
private:
    std::string m_sPriKeyPath;
    std::string m_sPubKeyPath;
    std::string m_sPriKeyPwd;
};

class TradeChannel
{
public:
    TradeChannel();

    //接收数据特别的处理 SufRecvHandle具体处理可能是解密,解压缩, 若无需任何处理则返回0,若出错返回-1,否则返回1
    int SufRecvHandle(const char* pRecvBuf, unsigned int ulLen, std::string& sRsp);
    int PreSendHandle(std::shared_ptr<char> &sendEnBuf, const std::string sSend);

    void SetSession(std::string sSessionID);
protected:
    int Unzip(const char* pRecvBuf, unsigned int ulLen, std::string& sRsp);
    int Decrypt(const char* pRecvBuf, unsigned int ulLen, std::string& sRsp, char cMode);
private:
//    std::string m_s3DesKey;
    std::string m_s3DesIV;
    std::string m_sSessionID;
};

#endif // AUTHCHANNEL_H
